package com.sxj.corejava.code06_lambda表达式;

import com.sxj.corejava.entity.User;

import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * @author 石小俊
 * @date 2023年12月2023/12/23日 9:24
 */
public class Test06_方法引用 {

    public static void main(String[] args) {
        // 对象::实例方法名
        Consumer<String> c = s -> System.out.println(s);
        c.accept("Hello World");
        test("Hello World");

        c = System.out::println;
        c.accept("Hello Consumer");

        User user = new User();
        // 相当于user.setUsername("admin")
        Consumer<String> c2 = user::setUsername;
        c2.accept("admin");

        System.out.println(user.getUsername());
        Supplier<String> s = user::getUsername;
        System.out.println(s.get());
        c.accept(s.get());

        // 类::静态方法名
        System.out.println(User.hello());
        Supplier<String> s2 = User::hello;
        c.accept(s2.get());

        // 类::实例方法名
        String str = new String("aa");
        str = "aa";
        str.equals("aa");
        Predicate<String> p = "aa"::equals;
        System.out.println(p.test("aa"));
        // 此时本质上就是字符串aa调用了equals方法
        // 断言型接口方法中的参数即为调用的equals方法的参数
        // 但是此时存在一个字符串写死了
        // 可以考虑将两个值都作为方法参数
        // 在JDK8中,除了核心的四大函数式接口以外,还存在一些接口
        // 例如:此时可以使用BiPredicate<T, U>接口
        // 接口方法:boolean test(T t, U u)
        // 第一个泛型即为调用方法的调用者类型
        // 第二个泛型类型即为调用的方法参数类型
        // 此时无法确定方法调用者是谁,调用者的对象已经作为方法的参数了
        // 此时方法参数是一个字符串,因此我可以确定最终调用者一个是一个字符串类型
        // 此时可以通过类::方法来进行调用
        BiPredicate<String,String> p2 = String::equals;
        boolean flag = p2.test("aa","aa");
        System.out.println(flag);
    }

    public static void test(String s){
        System.out.println(s);
    }

}
